package com.ruoyi.util.file;

import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;

import org.apache.commons.lang3.StringUtils;

/**
 * @Description:一些文件的工具
 * @ClassName: FileUtils
 * @author syc
 * @date: 2022年6月30日 上午10:23:03
 */
public class FileUtils {

//	public static void main(String[] args) {
//
//		//List<String> list =	FileUtils.getAllFile("E:\\STS\\xinjargou\\app\\src\\static\\img\\icon");
//		//List<String> list =	FileUtils.getAllFile("E:\\STS\\xinjargou\\app\\src\\static\\img\\icon");
////		List<String> fileNameList = FileUtils.getFileNameList("C:\\Users\\Acer\\Desktop\\桌面", true);
////		for (String str : fileNameList) {
////			System.out.println(str);
////		}
//		
//	}
	
	/**
	 * @Description: 获取文件夹下的所有文件
	 * @author syc
	 * @date: 2022年8月24日 下午4:54:57
	 */
	public static List<String> getFileNameList(String filePath, boolean isHaveChild) {
		List<String> fileNameList = new ArrayList<String>();
		if (filePath != null && !filePath.equals("")) {			
			fileNameList = getFileNameList(new File(filePath), fileNameList, isHaveChild);
		} 
        if (fileNameList == null || fileNameList.size() <= 0 ) {
        	return null;
        }
		return fileNameList;
	}
	
	/**
	 * @Description: 递归获去文件夹下的所有文件
	 * @author syc
	 * @date: 2022年8月24日 下午4:54:53
	 * 	注意如果地址不是文件夹,或者路径不存在则返回null
	 */
	public static List<String> getFileNameList(File dirFile, List<String> fileNameList, boolean isHaveChild) {
		// 如果文件夹不存在或着不是文件夹，则返回 null
		if (Objects.isNull(dirFile) || !dirFile.exists() || dirFile.isFile()) {
			return null;
		}			
		File[] childrenFiles = dirFile.listFiles();
		if (Objects.isNull(childrenFiles) || childrenFiles.length == 0) {
			return null;
		}
		for (File childFile : childrenFiles) {
			// 如果时文件，直接添加到结果集合
			if (childFile.isFile()) {
				fileNameList.add(childFile.getAbsolutePath());
			} else {
				if (isHaveChild) {
					// 如果是文件夹，则将其内部文件添加进结果集合
					getFileNameList(childFile, fileNameList,isHaveChild);
				}
			}			
		}
		return fileNameList;
	}
	
	
	
	
	
	
	/*-------------------下面是参考别人的--------------------------*/
	
	/**
	 * <h1>获取指定文件夹下所有文件，不含文件夹</h1>
	 * 
	 * @param dirFilePath 文件夹路径
	 * @return
	 */
	public static List<String> getAllFile(String dirFilePath) {
		if (StringUtils.isBlank(dirFilePath)) {
			return null;
		}
		List<String> list = getAllFile(new File(dirFilePath));
		return list;
	}

	/**
	 * <h1>获取指定文件夹下所有文件，不含文件夹</h1>
	 * 
	 * @param dirFile 文件夹
	 * @return
	 */
	public static List<String> getAllFile(File dirFile) {
		// 如果文件夹不存在或着不是文件夹，则返回 null
		if (Objects.isNull(dirFile) || !dirFile.exists() || dirFile.isFile())
			return null;

		File[] childrenFiles = dirFile.listFiles();
		if (Objects.isNull(childrenFiles) || childrenFiles.length == 0)
			return null;

		List<String> fileNames = new ArrayList<>();
		for (File childFile : childrenFiles) {

			// 如果时文件，直接添加到结果集合
			if (childFile.isFile()) {
				// System.out.println(childFile.getAbsolutePath());
				fileNames.add(childFile.getAbsolutePath().substring(childFile.getAbsolutePath().lastIndexOf("\\") + 1));

				// files.add(childFile);
			} else {
				// 如果是文件夹，则将其内部文件添加进结果集合
				List<String> cFiles = getAllFile(childFile);
				if (Objects.isNull(cFiles) || cFiles.isEmpty()) {
					continue;
				}
				// files.addAll(cFiles);
			}

		}

		return fileNames;
	}

//	/**
//	 *  <h1>获取指定文件夹下所有文件，含文件夹</h1>
//	 * @param dirFilePath 文件夹路径
//	 * @return
//	 */
//	public static List<File> getAllFile(String dirFilePath){
//		if(StringUtils.isBlank(dirFilePath))
//			return null;
//		return getAllFile(new File(dirFilePath));
//	}
//	
//	/**
//	 *  <h1>获取指定文件夹下所有文件，不含文件夹</h1>
//	 * @param dirFile 文件夹
//	 * @return
//	 */
//	public static List<File> getAllFile(File dirFile){
//		// 如果文件夹不存在或着不是文件夹，则返回 null
//		if(Objects.isNull(dirFile) || !dirFile.exists() || dirFile.isFile()) 
//			return null;
//		
//		File[] childrenFiles =  dirFile.listFiles();
//		if(Objects.isNull(childrenFiles) || childrenFiles.length == 0) 
//			return null;
//
//		List<File> files = new ArrayList<>();
//		for(File childFile : childrenFiles) {
//			
//			// 如果时文件，直接添加到结果集合
//			if(childFile.isFile()) {
//				files.add(childFile);
//			}else {
//				// 如果是文件夹。则先将其添加到结果集合，再将其内部文件添加进结果集合。
//				files.addAll(childFile); 
//				List<File> cFiles =  getAllFile(childFile);
//				if(Objects.isNull(cFiles) || cFiles.isEmpty()) continue;
//				files.addAll(cFiles);
//			}
//			
//		}
//		
//		return files;
//	}

}
